namespace VRTK.Examples
|
|
{
|
|
using UnityEngine;
|
|
|
|
public class ToggleCustomHands : MonoBehaviour
|
|
{
|
|
public VRTK_ControllerEvents leftController;
|
|
public VRTK_ControllerEvents rightController;
|
|
|
|
public GameObject leftHandAvatar;
|
|
public GameObject rightHandAvatar;
|
|
|
|
protected bool state;
|
|
|
|
protected virtual void OnEnable()
|
|
{
|
|
state = false;
|
|
if (leftController != null)
|
|
{
|
|
leftController.ButtonTwoPressed += ToggleHands;
|
|
}
|
|
|
|
if (rightController != null)
|
|
{
|
|
rightController.ButtonTwoPressed += ToggleHands;
|
|
}
|
|
ToggleVisibility();
|
|
}
|
|
|
|
protected virtual void OnDisable()
|
|
{
|
|
if (leftController != null)
|
|
{
|
|
leftController.ButtonTwoPressed -= ToggleHands;
|
|
}
|
|
|
|
if (rightController != null)
|
|
{
|
|
rightController.ButtonTwoPressed -= ToggleHands;
|
|
}
|
|
}
|
|
|
|
protected virtual void ToggleHands(object sender, ControllerInteractionEventArgs e)
|
|
{
|
|
state = !state;
|
|
ToggleVisibility();
|
|
}
|
|
|
|
protected virtual void ToggleVisibility()
|
|
{
|
|
ToggleAvatarVisibility();
|
|
ToggleSDKVisibility();
|
|
ToggleScriptAlias();
|
|
}
|
|
|
|
protected virtual void ToggleAvatarVisibility()
|
|
{
|
|
if (leftHandAvatar != null)
|
|
{
|
|
leftHandAvatar.SetActive(state);
|
|
}
|
|
if (rightHandAvatar != null)
|
|
{
|
|
rightHandAvatar.SetActive(state);
|
|
}
|
|
}
|
|
|
|
protected virtual void ToggleSDKVisibility()
|
|
{
|
|
VRTK_SDKSetup sdkType = VRTK_SDKManager.GetLoadedSDKSetup();
|
|
if (sdkType != null)
|
|
{
|
|
VRTK_ControllerReference leftController = VRTK_ControllerReference.GetControllerReference(VRTK_DeviceFinder.GetControllerLeftHand(true));
|
|
VRTK_ControllerReference rightController = VRTK_ControllerReference.GetControllerReference(VRTK_DeviceFinder.GetControllerRightHand(true));
|
|
switch (sdkType.name)
|
|
{
|
|
case "SteamVR":
|
|
ToggleControllerRenderer(leftController.actual, "Model");
|
|
ToggleControllerRenderer(rightController.actual, "Model");
|
|
break;
|
|
case "Oculus":
|
|
ToggleControllerRenderer(leftController.model);
|
|
ToggleControllerRenderer(rightController.model);
|
|
break;
|
|
case "WindowsMR":
|
|
ToggleControllerRenderer(leftController.model, "glTFController");
|
|
ToggleControllerRenderer(rightController.model, "glTFController");
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
protected virtual void ToggleControllerRenderer(GameObject controller, string findPath = "")
|
|
{
|
|
if (controller != null)
|
|
{
|
|
if (findPath == "")
|
|
{
|
|
controller.SetActive(!state);
|
|
}
|
|
else
|
|
{
|
|
Transform childModel = controller.transform.Find(findPath);
|
|
if (childModel != null)
|
|
{
|
|
childModel.gameObject.SetActive(!state);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
protected virtual void ToggleScriptAlias()
|
|
{
|
|
GameObject scriptLeft = VRTK_DeviceFinder.GetControllerLeftHand(false);
|
|
GameObject scriptRight = VRTK_DeviceFinder.GetControllerRightHand(false);
|
|
CycleScriptAlias(scriptLeft, leftHandAvatar);
|
|
CycleScriptAlias(scriptRight, rightHandAvatar);
|
|
}
|
|
|
|
protected virtual void CycleScriptAlias(GameObject controller, GameObject avatar)
|
|
{
|
|
if (controller != null)
|
|
{
|
|
VRTK_InteractTouch touch = controller.GetComponentInChildren<VRTK_InteractTouch>();
|
|
VRTK_InteractGrab grab = controller.GetComponentInChildren<VRTK_InteractGrab>();
|
|
touch.enabled = false;
|
|
grab.enabled = false;
|
|
|
|
touch.customColliderContainer = null;
|
|
grab.ForceControllerAttachPoint(null);
|
|
|
|
if (avatar != null && state)
|
|
{
|
|
touch.customColliderContainer = avatar.transform.Find("HandColliders").gameObject;
|
|
grab.ForceControllerAttachPoint(avatar.transform.Find("GrabAttachPoint").GetComponent<Rigidbody>());
|
|
}
|
|
touch.enabled = true;
|
|
grab.enabled = true;
|
|
}
|
|
}
|
|
}
|
|
}
|